/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.documentar.model;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultComboBoxModel;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Santos
 */
public class TelaModel {

    private int codigo;
    private ProdutoModel produtoModel;
    private CategoriaArvoreModel categoriaModel;
    private TelaModel telaPaiModel;
    private String nome;
    private char ativo;
    private char temFilho;
    private String caminhoCompletoTela;
    private String caminhoCompletoSemItemTela;
    private VersaoModel versaoModel;
    private String nomeTela;

    public String getNomeTela() {
        return nomeTela;
    }

    public void setNomeTela(String nomeTela) {
        this.nomeTela = nomeTela;
    }

    public VersaoModel getVersaoModel() {
        if (versaoModel == null) {
            versaoModel = new VersaoModel();
        }
        return versaoModel;
    }

    public void setVersaoModel(VersaoModel versaoModel) {
        this.versaoModel = versaoModel;
    }

    public String getCaminhoCompletoSemItemTela() {
        return caminhoCompletoSemItemTela;
    }

    public void setCaminhoCompletoSemItemTela(String caminhoCompletoSemItemTela) {
        this.caminhoCompletoSemItemTela = caminhoCompletoSemItemTela;
    }

    public String getCaminhoCompletoTela() {
        return caminhoCompletoTela;
    }

    public void setCaminhoCompletoTela(String caminhoCompletoTela) {
        this.caminhoCompletoTela = caminhoCompletoTela;
    }

    public int getCodigo() {
        return codigo;
    }

    public void setCodigo(int codigo) {
        this.codigo = codigo;
    }

    public ProdutoModel getProdutoModel() {
        if (produtoModel == null) {
            produtoModel = new ProdutoModel();
        }
        return produtoModel;
    }

    public void setProdutoModel(ProdutoModel produtoModel) {
        this.produtoModel = produtoModel;
    }

    public CategoriaArvoreModel getCategoriaModel() {
        if (categoriaModel == null) {
            categoriaModel = new CategoriaArvoreModel();
        }
        return categoriaModel;
    }

    public void setCategoriaModel(CategoriaArvoreModel categoriaModel) {
        this.categoriaModel = categoriaModel;
    }

    public TelaModel getTelaPaiModel() {
        if (telaPaiModel == null) {
            telaPaiModel = new TelaModel();
        }
        return telaPaiModel;
    }

    public void setTelaPaiModel(TelaModel telaPaiModel) {
        this.telaPaiModel = telaPaiModel;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public char getAtivo() {
        return ativo;
    }

    public void setAtivo(char ativo) {
        this.ativo = ativo;
    }

    public char getTemFilho() {
        return temFilho;
    }

    public void setTemFilho(char temFilho) {
        this.temFilho = temFilho;
    }

    public String getActionScript() {
        return actionScript;
    }

    public void setActionScript(String actionScript) {
        this.actionScript = actionScript;
    }

    /**
     * Ação do script SQL na execução do programa
     */
    private String actionScript;
    /**
     * Modelo de um comboBox para utiliza nas telas
     */
    private DefaultComboBoxModel modelComboBox;
    /**
     * Modelo de uma table para utilizar nas telas
     */
    private DefaultTableModel modelTable;
    /**
     * Lista contendo os dados relacionados da consulta feita na tabela setor.
     * Mas é necessário rever o nome dessa variável, sugestão: lista+Classe
     */
    private List<TelaModel> listaArvore;
    /**
     * Variavel responsável por recepcionar dados extraidos das consultas
     * executadas na banco de dados
     */
    private ResultSet resultSet;

    public DefaultComboBoxModel getModelComboBox() {
        if (modelComboBox == null) {
            modelComboBox = new DefaultComboBoxModel();
            modelComboBox.addElement("ESCOLHER");
            modelComboBox.addElement("0 - RAIZ");
        }
        return modelComboBox;
    }

    public void setModelComboBox(DefaultComboBoxModel modelComboBox) {
        this.modelComboBox = modelComboBox;
    }

    public DefaultTableModel getModelTable() {
        if (modelTable == null) {
            modelTable = new DefaultTableModel();
            modelTable.addColumn("Codigo");
            modelTable.addColumn("Produto");
            modelTable.addColumn("Categoria");
            modelTable.addColumn("Nome");
            modelTable.addColumn("Tela Pai");
            modelTable.addColumn("Ativo");
            modelTable.addColumn("Tem Filho");
        }
        return modelTable;
    }

    public void setModelTable(DefaultTableModel modelTable) {
        this.modelTable = modelTable;
    }

    public List<TelaModel> getListaArvore() {
        if (listaArvore == null) {
            listaArvore = new ArrayList<>();
        }
        return listaArvore;
    }

    public void setListaArvore(List<TelaModel> listaArvore) {
        this.listaArvore = listaArvore;
    }

    public ResultSet getResultSet() {
        return resultSet;
    }

    public void setResultSet(ResultSet resultSet) {
        this.resultSet = resultSet;
    }

    /**
     * Metodo responsável por encontrar o cadastro do setor em uma lista
     *
     * @param codigo Codigo de identificação do setor
     * @return Modelo da Classe com o dado encontrado
     */
    public TelaModel getTela(int codigo) {
        TelaModel model = null;
        for (TelaModel telaModel : getListaArvore()) {
            if (telaModel.getCodigo() == codigo) {
                model = telaModel;
                break;
            }
        }
        return model;
    }

    public TelaModel getCategoria(String nome) {
        TelaModel model = null;
        for (TelaModel arvoreModel : getListaArvore()) {
            if (arvoreModel.getNome().equals(nome)) {
                model = arvoreModel;
                break;
            }
        }
        return model;
    }
    /**
     * Variável auxiliar para ordenar a lista
     */
    List<TelaModel> listaOrdenada = new ArrayList<>();

    /**
     * Metodo responsável por ordenar os dados em uma lista para exibição dos
     * dados
     *
     * @param lista
     * @return
     */
    public List<TelaModel> getOrdenaArvore(List<TelaModel> lista) {

        for (TelaModel arvoreModel : lista) {
            //verificar se é raiz, se o codigo do pai for igual a zero
            if (arvoreModel.getTelaPaiModel().getCodigo() == 0) {

                //verificar se ja existe
                boolean exists = false;
                for (TelaModel checkExists : listaOrdenada) {
                    if (arvoreModel.getCodigo() == checkExists.getCodigo()) {
                        exists = true;
                    }
                }
                if (exists == false) {
                    //   System.out.println(telaModel.getCodigoProcesso() + " - " + telaModel.getNome());
                    listaOrdenada.add(arvoreModel);
                }

                getFilhoNoRaiz(lista, arvoreModel, 1);
            }

        }
        return listaOrdenada;
    }

    public void getFilhoNoRaiz(List<TelaModel> listaOriginal, TelaModel model, int nivel) {
        if (model.getTemFilho() == 'N') {
            //return model;
        } else {
            for (TelaModel modelArvore : listaOriginal) {
                if (model.getCodigo() == modelArvore.getTelaPaiModel().getCodigo()) {
                    //verifica se já foi adicionado
                    boolean exists = false;
                    for (TelaModel checkExists : listaOrdenada) {
                        if (checkExists.getCodigo() == modelArvore.getCodigo()) {
                            exists = true;
                        }
                    }
                    if (exists == false) {
                        //System.out.println("|" + getTracoSeparador(nivel) + "-> " + modelArvore.getCodigoProcesso() + " - " + modelArvore.getNome());
                        listaOrdenada.add(modelArvore);
                        getFilhoNoRaiz(listaOriginal, modelArvore, nivel + 1);
                    }

                }
            }
        }

    }

    /**
     * Metodo responsável por gerar um traço separador pelo nível do item na
     * arvore
     *
     * @param quantidade
     * @return
     */
    public String getTracoSeparador(int quantidade) {
        String traco = "-";
        for (int i = 0; i < quantidade; i++) {
            traco = traco.concat("-");
        }
        return traco;
    }
}
